package com.example.mysql.学习笔记.高级.数据库的优化之索引.InnoDB数据存储结构存储;

public class 页的内部结构 {
    public static void main(String[] args) {

    }
}
/**
 * 在 InnoDB 中
 * 页如果按类型划分的话，
 * 常见的有数据页(保存B+树节点)、系统页、 Undo 页和事务数据页等。
 * 数据页是我们最常使用的页。
 * 数据页的16KB大小的存储空间被划分为七个部分,
 * 分别是：   共16kb
 * 文件头(38字节)、页头 (56字节)、最大最小记录(26字节) 、
 * 用户记录(不确定)、空闲空间(不确定)、页目录(不确定)和文件尾(8字节)。
 *
 *
 *
 */

/**
 * 文件头 )
 *  校验和                4
 *    (尾部也有一个校验和 当头和尾一样  说明此页中间没有发生宕机等故障)
 *  页号                  4
 *  上一页的页号            4
 *  下一页的页号            4
 *  页面最后修改时的日志位置   8  (LSN)
 *  页类型                 2
 *  仅在系统表空间的一个页中定义，代表文件至少被刷新到了对应的LSN值  8
 *  页属于哪个表空间         4
 *
 *
 */

/**
 * 页头 (56字节)
 *
 * 为了能得到一个数据页中存储的记录的状态信息，
 * 比如本页中已经存储了多少条记录，
 * 第-条记录的地址是什么， 页目录中存储了多少个槽 等等，
 * 特意在页中定义了一个叫Page Header的部分，
 * 这个部分占用固定的56个字节，专门存储"""各种状态信息。"""
 *
 * 页目录中槽的数量(2字节)  也就是表示  数据一共分了多少组(包括最大最小记录)
 * 还未使用空间的最小地址(2字节)   添加记录时 好找从哪里添加
 * 本页中记录的数量(2字节)(包括最小记录  最大记录  标记删除的记录)
 * 记录第一个标记删除的地址(2字节)
 *      因为每个删除的记录会保存后面删除的地址  找到第一个  就找到了所有
 * 已删除的地址占用的字节数(2字节)  计算  有多少无用空间 值大的话  会重构
 * 最后插入记录的位置(2字节)
 * 记录插入的方向(2字节)  再次插入时从这个方向插入 加快插入速度
 * 同一个个方向连续插入的记录数量(2字节)
 * 本页中记录的数量(2字节)(不包括最小记录  最大记录  标记删除的记录)
 * 修改当前页的最大事务ID，该值仅在二级索引中定义(8字节)
 * 当前页在B+树所在的层级(2字节）  叶子节点时第0层
 * 索引ID表示当前页属于哪个索引(8字节)
 * B+树叶子段的头部信息  仅在B+树ROOT页定义(10字节)
 * B+树非叶子段的头部信息  仅在B+树ROOT页定义(10字节)
 *
 *
 */

/**
 * 最大最小记录(26字节) 、
 *
 * 表示当前记录在记录堆的位置信息（13位）
 *       MySQL会自动给每个页里加了两个记录，
 *       由于这两个记录并不是我们自己插入的，
 *       所以有时候也称为伪记录或者虚拟记录。
 *       这两个伪记录-个代表最小记录，一个代表最大记录
 *       最小记录和最大记录的heap_no值分别是0和1，
 *       也就是说它们的位置最靠前。
 *
 */

/**
 * 用户记录(不确定)
 * 这些记录  按照指定的格式  一条条以单链表保存
 * 用户记录里的一条条数据如何记录？
 *    记录的额外信息
 *       变长字段长度列表
 *       NULL值列表
 *       记录头信息（5个字节）（40位）
 *           预留位1（1位）
 *           预留位2（1位）
 *           标记该记录是否被删除（1位）
 *           B+树的每层非叶子节点中的最小记录都会添加该标记（1位）
 *           表示当前记录拥有的记录数（4位）
 *           表示当前记录在记录堆的位置信息（13位）
 *                  MySQL会自动给每个页里加了两个记录，
 *                  由于这两个记录并不是我们自己插入的，
 *                  所以有时候也称为伪记录或者虚拟记录。
 *                  这两个伪记录-个代表最小记录，一个代表最大记录
 *                  最小记录和最大记录的heap_no值分别是0和1，
 *                  也就是说它们的位置最靠前。
 *           表示当前记录的类型，0表示普通记录，  （3位）
 *                           1 表示B+树非叶节点记录，
 *                           2表示最小记录，
 *                           3表示最大记录
 *            表示下一条记录的相对位置（16位）
 *                  地址偏移量  从当前位置从后找多少到一条记录
 *
 *       如果删除了中间一条信息
 *         前一条的表示吓一条记录就会改变
 *         标记该记录是否被删除（1位） 从0改到1
 *        最大记录  中有一个地方存储 本组 一共有多少记录  会减一
 *        最小纪录  没在最大记录的保存有多少记录里  """页目录(不确定)"""
 *        所以最大记录的2那个位置
 *
 *    记录信息(表的每一个列)
 *        列1  值1
 *        列2  值2
 *        列3  值3 ....
 *
 *
 */

/**
 * 空闲空间(不确定)
 *
 *
 */

/**
 * 页目录(不确定)
 * 把这一页的索引数据   分成好几个一组 按顺序存储
 *    最小记录单独一组
 *    最大记录一般包括1-8个数据
 *    中间的记录包括4-8条记录
 * 每组记录的最后一条记录的头部信息
 *    会存储本组记录一共有多少条纪录
 *
 *
 * 页目录用来存储每组最后一条记录的地址偏移量，
 * 这些地址偏移量会按照先后顺序存储起来，
 * 每组的地址偏移量也被称之为槽(slot)，
 * 每个槽相当于指针指向了不同组的最后一个记录（也就是最大记录）。
 *
 *
 */

/**
 * 文件尾(8字节)
 * 校验和  4   和头部相呼应
 * 日志序列位置(LSN)   和头部的日志位置   8  (LSN)相呼应
 *   两者指向不同位置   表示页同步出现问题
 *
 *
 */
